# Python re库使用

# 导入re库
import re

# 1. 正则表达式基本概念
"""
正则表达式是一种用于匹配字符串模式的强大工具。
常用的正则表达式符号包括：
. ：匹配任意单个字符（除换行符）
^ ：多行匹配时，匹配字符串的开头
$ ：多行匹配时，匹配字符串的结尾
* ：匹配前一个字符0次或多次
+ ：匹配前一个字符1次或多次
? ：匹配前一个字符0次或1次
\d：匹配数字
\w：匹配字母、数字或下划线
\s：匹配空白字符
\S：匹配所有非空白字符
[ ]：匹配方括号中的任意字符
[^]：否定字符集，匹配除方括号内字符外的任意字符
{n}：匹配前一个字符n次
( )：分组，将括号内的内容作为一个整体进行匹配，获取子匹配文本，比较常用
|：或，匹配多个模式中的任意一个
贪婪模式：默认情况下，正则表达式会尽可能多地匹配字符 用的比较多的写法：.*
非贪婪模式：在量词后面加上?，表示尽可能少地匹配字符 用的比较多的写法：.*?
"""

# 2. re.match()示例 - 从字符串开头匹配
print("=== re.match()示例 ===")
text = "Python3.9版本"
# 匹配以Python开头，后面跟数字和其他字符的字符串
# 正则表达式我们可以使用r前缀创建raw字符串，避免需要对反斜杠进行转义
# 如果不使用r前缀，需要写成'Python\\d'，因为\d在普通字符串中\会被当作转义字符
# raw字符串中的\会被直接当作普通字符，使正则表达式更易读和维护
result = re.match(r"Python\d", text)
if result:
    print(f"匹配成功：{result.group()}")  # 输出：匹配成功：Python3

# 3. re.search()示例 - 搜索整个字符串中的第一个匹配
print("\n=== re.search()示例 ===")
text = "联系方式：13812345678，手机号码：13987654321"
# 查找字符串中的手机号（简单的11位数字模式）
result = re.search(r"1\d{10}", text)
if result:
    print(f"找到手机号：{result.group()}")  # 输出第一个匹配的手机号

# 4. re.findall()示例 - 找到所有匹配项，较为常用
print("\n=== re.findall()示例 ===")
# 查找所有的手机号
results = re.findall(r"1\d{10}", text)
print(f"所有手机号：{results}")  # 输出所有匹配的手机号列表

# 5. re.sub()示例 - 替换匹配的内容
print("\n=== re.sub()示例 ===")
# 将手机号中间4位替换为****
# 正则表达式中使用括号()来创建分组，\1表示第一个分组，\2表示第二个分组，以此类推
text_masked = re.sub(r"(1\d{2})\d{4}(\d{4})", r"\1****\2", text)
print(f"隐藏手机号：{text_masked}")

# 6. re.split()示例 - 使用正则表达式分割字符串
# 区别于字符串的split方法只能使用单个分隔符
print("\n=== re.split()示例 ===")
text = "Python;Java,C++|JavaScript"
# 使用多个分隔符分割字符串
results = re.split(r"[;,|]", text)
print(f"分割结果：{results}")

# 7. re.compile()示例 - 编译正则表达式以提高效率
print("\n=== re.compile()示例 ===")
# 编译一个正则表达式对象
pattern = re.compile(r"1\d{10}")
# 使用编译后的正则表达式进行多次匹配
text1 = "手机号：13812345678"
text2 = "手机号：13987654321"
print(f"匹配结果1：{pattern.search(text1).group()}")
print(f"匹配结果2：{pattern.search(text2).group()}")
# 当一个正则表达式需要被多次使用时，可以先使用re.compile()编译正则表达式，这是惯用的优化性能的做法
# 编译后的返回值，我们这里是pattern就是一个正则表达式对象，后续的可以调用的命令跟我们直接使用re库的命令是一样的
# 比如这里的pattern.search(text1).group()，就是相当于re.search(r'1\d{10}', text1).group()

"""
re库使用总结：
1. match()适合检查字符串开头的模式
2. search()用于查找第一个匹配项
3. findall()获取所有匹配项
4. sub()用于替换匹配的内容
5. split()可以使用正则表达式分割字符串
6. compile()用于编译正则表达式，提高多次使用时的效率
7. 使用括号()可以创建分组，便于提取特定部分
"""
